/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cl.alanis.dao.impl;

import cl.alanis.dao.Dao;
import cl.alanis.dao.VentaDao;
import cl.alanis.dto.VentaDto;
import cl.alanis.util.AlanisLog;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.log4j.Logger;


/**
 *
 * @author Pía
 */
public class VentaDaoImpl extends Dao implements VentaDao{
   
    Logger logger=AlanisLog.obtenerLogger(VentaDaoImpl.class);
    public VentaDaoImpl(){
        
        super();
    }
    @Override
    public boolean insertarVenta(VentaDto venta) throws SQLException,Exception{
        logger.debug("Insertando una venta:\n"+venta);
        String insert="INSERT INTO VENTA(COD_VENTA,"+
                                    "RUT_V,"+
                                    "FECHA_VENTA,"+
                                    "VALOR_TOTAL,"+
                                    "DESCUENTO_VENTA,"+
                                    "DESCRIPCION_VENTA,"+
                                    "DESCRIPCION_DESCUENTO,"
                                  + "NUMERO_BOLETA) "
                                + "VALUES(?,?,?,?,?,?,?,?)";
        
       
        try {
            PreparedStatement pstmt = conexion.preparedStatement(insert);
            pstmt.setInt(1, venta.getCodVenta());
            pstmt.setString(2,venta.getRutVendedor());
            pstmt.setDate(3,new Date(venta.getFechaVenta()));
            pstmt.setDouble(4,venta.getValorTotal());
            pstmt.setFloat(5,venta.getDescuento());
            pstmt.setString(6,venta.getDescripcion());
            pstmt.setString(7,venta.getDescripcionDescuento());
            pstmt.setString(8, venta.getNumBoleta());
            pstmt.executeUpdate();
            //conexion.commit();
        } catch (SQLException ex) {
            logger.error("Error:"+ex.getMessage());
            throw new Exception("Error en el sistema");
        }
        
        return true;
    }

    @Override
    public Integer generaCodigo() throws SQLException,Exception {
        logger.debug("Obteniendo codigo de venta");
        String select="SELECT MAX(COD_VENTA) AS MAX_COD FROM VENTA";
        Integer codigo = null;
        try {
            PreparedStatement pstmt = conexion.preparedStatement(select);
            ResultSet rs = pstmt.executeQuery();
            if(rs.next())
                codigo=rs.getInt("MAX_COD");
            else{
                codigo=new Integer(0);
            }
        } catch (SQLException ex) {
            logger.error("Error:"+ex.getMessage());
            throw new Exception("Error en el sistema");
        }finally{
            conexion.close();
        }
        return codigo+1;
    }
    
    public VentaDto obtenerVenta(VentaDto venta) throws Exception{
        VentaDto ventaRetorno=new VentaDto();
        logger.debug("Obteniendo venta:"+venta);
        String where="";
        Integer valorInt;
        String valorStr="";
        String consulta="";
        String select="SELECT COD_VENTA,"+
                                "RUT_V,"+
                                "FECHA_VENTA,"+
                                "VALOR_TOTAL,"+
                                "DESCUENTO_VENTA,"+
                                "DESCRIPCION_VENTA,"+
                                "DESCRIPCION_DESCUENTO "+
                "           FROM VENTA ";
        if(venta.getCodVenta()!=null){
            where=" WHERE COD_VENTA=?";
            valorInt=venta.getCodVenta();
        }
        else if(venta.getNumBoleta()!=null){
            where=" WHERE NUMERO_BOLETA=?";
            valorStr=venta.getNumBoleta();
        }
            
        try {
            consulta= select + where;
            PreparedStatement pstmt = conexion.preparedStatement(consulta);
            if(venta.getCodVenta()!=null)
                pstmt.setInt(1, venta.getCodVenta());
            else if(venta.getNumBoleta()!=null)
                pstmt.setString(1, venta.getNumBoleta());
            ResultSet rs = pstmt.executeQuery();
            if(rs.next()){
                ventaRetorno.setCodVenta(rs.getInt("COD_VENTA"));
                ventaRetorno.setRutVendedor(rs.getString("RUT_V"));
                ventaRetorno.setFechaVenta(rs.getDate("FECHA_VENTA").getTime());
                ventaRetorno.setValorTotal(rs.getDouble("VALOR_TOTAL"));
                ventaRetorno.setDescuento(rs.getFloat("DESCUENTO_VENTA"));
                ventaRetorno.setDescripcion(rs.getString("DESCRIPCION_VENTA"));
                ventaRetorno.setDescripcionDescuento(rs.getString("DESCRIPCION_DESCUENTO"));                
            }
            else ventaRetorno=null;
        } catch (SQLException ex) {
            logger.error("Error:"+ex.getMessage());
            throw new Exception("Error en el sistema");
        }
        return ventaRetorno;
    }

    @Override
    public void actualizarVenta(VentaDto venta) throws Exception {
        
        logger.debug("Actualizando Venta:"+venta);
        String update="UPDATE VENTA SET RUT_V=?,"+
                                        "FECHA_VENTA=?,"+
                                        "VALOR_TOTAL=?,"+
                                        "DESCUENTO_VENTA=?,"+
                                        "DESCRIPCION_VENTA=?,"+
                                        "DESCRIPCION_DESCUENTO=? "+
                                "WHERE COD_VENTA=?";
        try {
            PreparedStatement pstmt = conexion.preparedStatement(update);            
            pstmt.setString(1,venta.getRutVendedor());
            pstmt.setDate(2,new Date(venta.getFechaVenta()));
            pstmt.setDouble(3,venta.getValorTotal());
            pstmt.setFloat(4,venta.getDescuento());
            pstmt.setString(5,venta.getDescripcion());
            pstmt.setString(6,venta.getDescripcionDescuento());
            pstmt.setInt(7, venta.getCodVenta());
            pstmt.executeUpdate();
        } catch (SQLException ex) {
            logger.error("Error:"+ex.getMessage());
            throw new Exception("Error en el sistema");
        }
    }
}

